#include <stdio.h>
#include <stdlib.h>

// int Add(int x, int y)
// {
//     return x + y;
// }
// int Sub(int x, int y)
// {
//     return x - y;
// }

// int main()
// {
//     // 函数也是有地址的，&Add和Add等价，函数名本质上就是函数的地址
//     // 函数指针
//     int (*pf1)(int, int) = &Add;
//     int (*pf2)(int, int) = Sub;
//     // 函数指针数组
//     int (*pfArr[2])(int, int) = {pf1, pf2};
//     return 0;
// }

void menu()
{
    printf("************************\n");
    printf("****1. Add    2. Sub****\n");
    printf("****3. Mul    4. div****\n");
    printf("****0. Exit         ****\n");
    printf("************************\n");
}
int Add(int x, int y)
{
    return x + y;
}
int Sub(int x, int y)
{
    return x - y;
}
int Mul(int x, int y)
{
    return x * y;
}
int Div(int x, int y)
{
    return x / y;
}
// 代码冗余
//  int main()
//  {
//      int input = 0;
//      int x = 0;
//      int y = 0;
//      int ret = 0;
//      do
//      {
//          menu();
//          printf("请选择:>");
//          scanf("%d", &input);
//          switch (input)
//          {
//          case 1:
//              printf("请输入两个操作数:>");
//              scanf("%d %d", &x, &y);
//              ret = Add(x, y);
//              printf("%d\n", ret);
//              break;
//          case 2:
//              printf("请输入两个操作数:>");
//              scanf("%d %d", &x, &y);
//              ret = Sub(x, y);
//              printf("%d\n", ret);
//              break;
//          case 3:
//              printf("请输入两个操作数:>");
//              scanf("%d %d", &x, &y);
//              ret = Mul(x, y);
//              printf("%d\n", ret);
//              break;
//          case 4:
//              printf("请输入两个操作数:>");
//              scanf("%d %d", &x, &y);
//              ret = Div(x, y);
//              printf("%d\n", ret);
//              break;
//          case 0:
//              printf("退出计算器\n");
//              break;
//          default:
//              printf("输入错误，重新选择\n");
//              break;
//          }
//      } while (input);

//     return 0;
// }

// int main()
// {
//     int input = 0;
//     int x = 0;
//     int y = 0;
//     int ret = 0;
//     do
//     {
//         menu();
//         printf("请选择:>");
//         scanf("%d", &input);
//         // 利用函数指针数组简化代码
//         int (*pfArr[])(int, int) = {NULL, Add, Sub, Mul, Div};
//         if (input == 0)
//         {
//             printf("退出计算器\n");
//         }
//         else if (input >= 1 && input <= 4)
//         {
//             printf("请输入两个操作数:>\n");
//             scanf("%d %d", &x, &y);
//             ret = pfArr[input](x, y);
//             printf("%d\n", ret);
//         }
//         else
//             printf("选择错误，重新选择\n");

//     } while (input);

//     return 0;
// }

// 还可以利用回调函数来简化代码
// 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数，当这个指针被用来调用其所指向的函数时，我们就说这是回调函数

// void calc(int (*ptr)(int, int))
// {
//     int x = 0;
//     int y = 0;
//     int ret = 0;
//     printf("请输入两个操作数:>");
//     scanf("%d %d", &x, &y);
//     ret = ptr(x, y);
//     printf("%d\n", ret);
// }
// int main()
// {
//     int input = 0;
//     do
//     {
//         menu();
//         printf("请选择:>");
//         scanf("%d", &input);
//         switch (input)
//         {
//         case 1:
//             calc(&Add);
//             break;
//         case 2:
//             calc(&Sub);
//             break;
//         case 3:
//             calc(&Mul);
//             break;
//         case 4:
//             calc(Div);
//             break;
//         case 0:
//             printf("退出计算器\n");
//             break;
//         default:
//             printf("输入错误，重新选择\n");
//             break;
//         }
//     } while (input);

//     return 0;
// }

// 冒泡排序
void bubble_sort(int arr[], int sz)
{
    int flag = 1;
    // 趟数
    for (int i = 0; i < sz - 1; i++)
    {
        // 每趟冒泡排序的过程
        for (int j = 0; j < sz - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                flag = 0;
                int tmp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = tmp;
            }
        }
        if (flag)
        {
            break;
        }
    }
}

void Print_arr(int arr[], int sz)
{
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// int main()
// {
//     int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
//     int sz = sizeof(arr) / sizeof(arr[0]);
//     Print_arr(arr, sz);
//     bubble_sort(arr, sz);
//     Print_arr(arr, sz);
//     return 0;
// }

int camp_int(const void *e1, const void *e2)
{
    return *(int *)e1 - *(int *)e2;
}
int main()
{
    int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    int sz = sizeof(arr) / sizeof(arr[0]);
    Print_arr(arr, sz);
    qsort(arr, sz, sizeof(arr[0]), camp_int);
    Print_arr(arr, sz);
    return 0;
}